package easier.app.x.task;

import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Looper;
import android.os.Message;
import androidx.annotation.NonNull;

/**
 * 定时任务处理,{@link #start(Runnable, long)}开始延时任务,{@link #stop()}结束任务执行
 */
public class ScheduledTask {

    /**
     * 消息类型
     */
    private static final int WHAT_MSG = 1;

    /**
     * 定时处理消息
     */
    private final Handler mHandler = new Handler( Looper.getMainLooper(), new Callback() {
        @Override
        public boolean handleMessage( @NonNull Message msg ) {

            try {
                if ( mTask != null ) {
                    mTask.run();
                }
            } catch ( Exception e ) {
                e.printStackTrace();
            }
            sendMessage();
            return true;
        }
    } );

    /**
     * 延时时间
     */
    private long mDelay = 1;

    /**
     * 实际任务
     */
    private Runnable mTask;

    /**
     * 发送延时任务
     */
    private void sendMessage() {

        mHandler.sendEmptyMessageDelayed( WHAT_MSG, mDelay > 0 ? mDelay : 1 );
    }

    /**
     * 发送一个任务定时循环处理
     *
     * @param task  定时任务
     * @param delay 延时时间
     */
    public void start( Runnable task, long delay ) {

        stop();
        mTask = task;
        mDelay = delay;
        sendMessage();
    }

    /**
     * 发送一个任务定时循环处理,先立即执行,然后延时执行
     *
     * @param task  定时任务
     * @param delay 延时时间
     */
    public void startImmediately( Runnable task, long delay ) {

        stop();
        mTask = task;
        mDelay = delay;
        mHandler.sendEmptyMessage( WHAT_MSG );
    }

    /**
     * 停止
     */
    public void stop() {

        mHandler.removeMessages( WHAT_MSG );
    }
}
